<?
	/* Se asegura que el archivo es incluido por el index */
		defined( 'LOAD_MODULE_ACTION' ) or die( 'No esta permitido el acceso directo a ' . __FILE__ );
	/* Cuando se hace el include del archivo automaticamente crea un objeto y lo guarda en una variable temporal */
		$this->oTmpObject = new Ubicacion_frm( $this );

	class Ubicacion_frm extends Frm
	{
	function Ubicacion_frm( &$oModule )
		{
			$this->Frm( $oModule );
			$this->aFields['ncUbicacion'] 			= new Input( "Codigo", "ncUbicacion", '', false, true );
			$this->aFields['cdUbicacion'] 			= new InputText ( "Nombre", "cdUbicacion" );
			$this->aFields['cOriginal'] 				= new InputText ( "Nombre original", "cOriginal" );
			$this->aFields['cSigla'] 					= new InputText ( "Siglas", "cSigla" );
			$this->aFields['cPrefijoTelefono'] 	= new InputText ( "Telefono", "cPrefijoTelefono" );
			$this->aFields['cPostal'] 					= new InputMultiple ( "Codigos postales", "cPostal" );
			$this->aFields['ncPais'] 					= new InputList ( "Pais", "ncPais" );
			$this->aFields['ncTipoUbicacion'] 	= new InputList ( "Tipo",  "ncTipoUbicacion" );
			$this->aFields['ncUbicacionPadre'] 	= new InputLookUp ( "Dentro de", "ncUbicacionPadre" );
			$this->aFields['ncUbicacionCambio'] 	= new InputLookUp ( "Reemplazar los domicilios existentes por:", "ncUbicacionCambio" );
			$oncUbicacionActual		= new InputNumber( "ncUbicacionActual");
			if ( strpos( getParam( 'ncUbicacion' ) , "|" ) )
				{
					list( $ncPais, $ncUbicacion ) = explode( '|', getParam( 'ncUbicacion' )  ) ;
					$this->aFields['ncUbicacion']->setValue ( $ncUbicacion );
					$this->aFields['ncPais']->setValue ( $ncPais );
				}
			// Si ya Selecciono => Cierra
				if ( $_POST['Aceptar'] == 'Aceptar' && $oncUbicacionActual->getValue()  )
				{
					list( $ncPais, $ncUbicacion ) = explode( '|', $oncUbicacionActual->getValue() ) ;
					$aReferencia = $this->armarReferencia( $ncPais, $ncUbicacion );
					$cKey = $oncUbicacionActual->getValue() . "|" . $aReferencia['cPostal']. "|" . $aReferencia['cPrefijoTelefono']. "|" . $aReferencia['cReferencia'] . "|" . $aReferencia['cdUbicacion'];
					$oExe = $this->oModule->loadClass('ubicacion_exe');
					$oExe->setInputData( $oncUbicacionActual->getValue(), $aReferencia['cdUbicacion'] );
				}
		}
	function verify()
	{
		$cdUbicacion = getParam('cdUbicacion');
		if ( $cdUbicacion  != "")
		{
			$cdUbicacion = str_replace( ' ' , '%', ' ' . $cdUbicacion . ' ' );
			list ( $ncUbicacionExistente ,$cdUbicacionExistente )= $this->oDatabase->getArray("SELECT ncUbicacion, cdUbicacion  FROM acUbicacion WHERE cdUbicacion like '$cdUbicacion' ");
			if ( $cdUbicacionExistente ) $this->addMessage( "Verifique que la Ubicacion no este ya cargada, ya existe una " . 	$this->oModule->makeAction ( $cdUbicacionExistente, VER_UBICACION , "ncUbicacion=" . $ncUbicacionExistente ) , FORM_ADVERTENCIA );
		}
	}
	function setLevel( $nLevel)
		{
			switch ( $nLevel )
			{
				case 2:
					$this->aInput = array ( 'ncUbicacion', 'ncPais', 'cdUbicacion', 'cOriginal', 'cSigla', 'ncUbicacionPadre' , 'cPrefijoTelefono', 'cPostal', 'ncTipoUbicacion' );
					break;
				case 3:
					$this->aInput = array ( 'ncUbicacion', 'ncUbicacionCambio', 'ncPais' );
					break;
			}
		}
	function setValue( $ncPais, $ncUbicacion )
		{
			$this->aFields['ncUbicacion']->setValue( $ncUbicacion );

			$cSql = "SELECT cdUbicacion, cPrefijoTelefono, cPostal, ncPais, ncTipoUbicacion, ncUbicacionPadre, cOriginal
								FROM acUbicacion
								WHERE ncPais = $ncPais
								AND ncUbicacion = $ncUbicacion";
			$aDatos = $this->oDatabase->getArray($cSql);
			$this->aFields['cdUbicacion']->setValue( $aDatos['cdUbicacion'] );
			$this->aFields['cPrefijoTelefono']->setValue( $aDatos['cPrefijoTelefono'] );
			$this->aFields['cPostal']->setValue( $aDatos['cPostal'] );
			$this->aFields['cOriginal']->setValue( $aDatos['cOriginal'] );
			$this->aFields['ncPais']->setValue( $aDatos['ncPais'] );
			$this->aFields['ncTipoUbicacion']->setValue( $aDatos['ncTipoUbicacion'] );
			$this->aFields['ncUbicacionPadre']->setValue( $aDatos['ncPais'] . '|' . $aDatos['ncUbicacionPadre'] );
			// Busca los datos del padre
      $cSql = "SELECT cdUbicacion, ncPais, cPrefijoTelefono, cPostal FROM acUbicacion WHERE ncPais = $ncPais AND ncUbicacion = ". $aDatos['ncUbicacionPadre'];
      list( $cdUbicacionPadre, $ncPaisPadre, $cPrefijoTelefonoPadre, $cPostalPadre ) = $this->oDatabase->getArray( $cSql );
			$this->aFields['ncUbicacionPadre']->setDescription( $cdUbicacionPadre );
		}
	function initializeForm()
		{
			// Si viene el Ubicacion hace el retrieve
				if ( $this->isRetrievable() &&  $this->aFields['ncPais']->getValue() &&  $this->aFields['ncUbicacion']->getValue() )
				{
					$this->setValue( $this->aFields['ncPais']->getValue() , $this->aFields['ncUbicacion']->getValue() );
				}
			// Configura el Titulo
				$this->setLabel( 'Ubicacion' );
			return true;
		}
	function initializeField( $cField, &$oField )
		{
			switch ( $cField )
			{
				case 'ncUbicacion':
					$oField->setHidden();
				break;
				case 'cdUbicacion':
					$oField->setMandatory( $this->isMandatory() );
					$oField->setLength(40);
					if ( $this->getOptionsLevel() ==  2 && !$this->aFields['ncUbicacion']->getValue() ) $oField->setOnBlur( $this->getVerifyEvent() );
				break;
				case 'cOriginal':
					$oField->setLength(40);
					if ( $this->getOptionsLevel() ==  2 && !$this->aFields['ncUbicacion']->getValue() ) $oField->setOnBlur( $this->getVerifyEvent() );
				break;
				case 'cSigla':
					$oField->setLength(10);
				break;
				case 'cPrefijoTelefono':
					$oField->setHelp('Formato del campo es prefijo nacional y prefijo local tipo ## ### sin ( y +, por ej 54 11.');
					$oField->setLength(10);
				break;
				case 'cPostal':
					$oField->setInput( new InputText() );
					$oField->setForm( $this );
					$oField->setSeparator( ",");
				break;
				case 'ncPais':
					//$cSql = "SELECT ncPais, cdPais FROM acPais";
					//$oField->setMatrix( $this->oDatabase->getMatrix($cSql) );
					//$oField->setOnChangeAutoSubmit( $this );
					$oField->setHidden();
				break;
				case 'ncTipoUbicacion':
					$cSql = "SELECT ncTipoUbicacion, cdTipoUbicacion FROM acTipoUbicacion";
					if ( $this->aFields['ncUbicacionPadre']->getValue()  )
					{
						list( $ncPaisPadre, $ncUbicacionPadre ) = explode ( "|", $this->aFields['ncUbicacionPadre']->getValue()  );
						$nNivelPadre  =$this->oDatabase->getData("SELECT TUb.nNivel FROM acUbicacion as Ubi JOIN acTipoUbicacion as TUb ON Ubi.ncTipoUbicacion = TUb.ncTipoUbicacion WHERE ncPais = $ncPaisPadre AND ncUbicacion =  $ncUbicacionPadre "  ) ;
						if ( $nNivelPadre ) $cSql .=  " WHERE nNivel > " . $nNivelPadre ;
					}
					$cSql .=  " ORDER BY nNivel ";
					$oField->setMatrix( $this->oDatabase->getMatrix($cSql) );
				break;
				case 'ncUbicacionCambio':
					if ( $this->aFields['ncPais']->getValue() )
					{
						 $this->aFields['ncPais']->setHidden() ;
						$oField->setForm( $this );
						$oField->addActionArray( 1, $this->oModule->getActionArray( BUSCAR_UBICACIONES ), "ncPais=" . $this->aFields['ncPais']->getValue()  );
					}
				break;
				case 'ncUbicacionPadre':
					if ( $this->nLevel == 2 && !$this->aFields['ncPais']->getValue() )
					{
						$oField->setHidden();
					} else
					{
						if ( $oField->getValue() )
						{
							list( $ncPaisPadre, $ncUbicacionPadre ) = explode ( "|", $oField->getValue() );
							$cSql = "SELECT cdUbicacion FROM acUbicacion WHERE ncPais = $ncPaisPadre AND ncUbicacion = $ncUbicacionPadre "  ;
							$oField->setDescription( $this->oDatabase->getData( $cSql ) );
						}
						$oField->setMandatory( $this->isMandatory() );
						$oField->setForm( $this );
						$cJavaScript = "oKey              = eval(\"document.". $this->getFormName() .".ncUbicacionPadre_Key\");
														cKeyValue = oKey.value;
														nPos = cKeyValue.indexOf(\"|\");
														nPos1 = cKeyValue.indexOf(\"|\", nPos+1);
														oKey.value = cKeyValue.substring ( nPos+1, nPos1 );
														";
						$cJavaScript = "oKey   = eval(\"document.". $this->getFormName() . ".ncUbicacionPadre_Key\");
												oDesc             = eval(\"document.". $this->getFormName() . ".ncUbicacionPadre_Desc\" );
												oPostal           = eval(\"document.". $this->getFormName() . ".cPostal\" );
												oPrefijoTelefono  = eval(\"document.". $this->getFormName() . ".cPrefijoTelefono\" );
												cKeyValue = oKey.value;
												nPos = cKeyValue.indexOf(\"|\");
												nPos1 = cKeyValue.indexOf(\"|\", nPos+1);
												nPos2 = cKeyValue.indexOf(\"|\", nPos1+1);
												nPos3 = cKeyValue.indexOf(\"|\", nPos2+1);
												nPos4 = cKeyValue.indexOf(\"|\", nPos3+1);
												nPos5 = cKeyValue.length;
												oKey.value = cKeyValue.substring ( 0, nPos1 );
												if ( nPos2 != -1 &amp;&amp; nPos2 > nPos1 + 1 ) oPostal.value = cKeyValue.substring ( nPos1 + 1 , nPos2 );
												if ( nPos3 > nPos2 + 1 ) oPrefijoTelefono.value = cKeyValue.substring ( nPos2 + 1, nPos3 );
												if ( nPos5 > nPos4 + 1 ) oDesc.value = cKeyValue.substring ( nPos4 + 1, nPos5 );
												";
						$oField->setOnChange( $cJavaScript );
						$cUrl = URL_ROOT . '?' . PARAM_REFRESH . '=class&amp;' . PARAM_MODULE . '=administracion&amp;' . PARAM_ACTION . '=' . BUSCAR_UBICACIONES . '&amp;' . PARAM_CLASS . '=ubicacion_lst&amp;' . PARAM_METHOD . '=getData';
						$oField->setEditable( $cUrl );
						$oField->addActionArray( 1, $this->oModule->getActionArray( BUSCAR_UBICACIONES ), "ncPais=" . $this->aFields['ncPais']->getValue()  );
					}
				break;
			}
		}
		function armarReferencia ( $ncPais, $ncUbicacion )
			{
				$cReferencia = "";
				$aReferencia = array();
				$aReferencia['cReferencia'] = "";
				$ncUbicacionLoop = $ncUbicacion;
				$cUrl = '?' . PARAM_MODULE . '=administracion&amp;' . PARAM_ACTION . '=' . BUSCAR_UBICACIONES .  '&amp;' . PARAM_MODE .'=' . POPUP;

				do {
					$cSql = "SELECT cdUbicacion, ncUbicacionPadre, cPrefijoTelefono, cPostal, cdTipoUbicacion
								FROM acUbicacion as Ubi
									JOIN acTipoUbicacion as TUb
										ON TUb.ncTipoUbicacion = Ubi.ncTipoUbicacion
								WHERE ncPais = $ncPais
									AND ncUbicacion = $ncUbicacionLoop";
					list ( $cdUbicacion, $ncUbicacionPadre, $cPrefijoTelefono, $cPostal, $cdTipoUbicacion ) =  $this->oDatabase->getArray ( $cSql ) ;
					// Guarda los Datos de la Ubicacion (prioriza de la hoja a la raiz)
					if ( $aReferencia['cdUbicacion'] == '' && $cdUbicacion != '' ) $aReferencia['cdUbicacion'] = $cdUbicacion;
					if ( $aReferencia['cPrefijoTelefono'] == '' && $cPrefijoTelefono != '' ) $aReferencia['cPrefijoTelefono'] = $cPrefijoTelefono;
					if ( $aReferencia['cPostal'] == '' && $cPostal != '' ) $aReferencia['cPostal'] = $cPostal;
					$aReferencia['cReferencia'] = "<b>". $cdTipoUbicacion . ":</b> ". $cdUbicacion . ' ' . $aReferencia['cReferencia'];
					$aReferencia['cCamino'] =  $cdUbicacion . ":" . $aReferencia['cCamino'];
					$cLink = $this->oModule->makeLink( "$cUrl&amp;ncUbicacionFiltro=$ncPais|$ncUbicacionLoop", '', $cdUbicacion);
					$aReferencia['cUrl'] =  $cLink . "\\" . $aReferencia['cUrl'];
					$ncUbicacionLoop = $ncUbicacionPadre;
				} while ( $ncUbicacionPadre );
				return $aReferencia;
			}
		function makeJerarquico()
		{
			//Crea los Objetos de los campos de edicion
				$oncUbicacionActual	= new InputNumber( "ncUbicacionActual");
				$oncUbicacionFiltro	= new InputList ( "ncUbicacionFiltro" );
			// Arma el Tab
				$oTab = new Tab('ubicacion_frm');
				$oTab->addTab ( 'Jerarquica' , 1, 'J' );
				$oTab->addTab ( 'Listado', 2 , 'L');
			// Muestra el Tab
				$oTab->make();
				$cUrl = '?' . PARAM_MODULE . '=administracion&amp;' . PARAM_ACTION . '=' . BUSCAR_UBICACIONES .  '&amp;' . PARAM_MODE .'=' . POPUP;
				?>
				<div class="tab_contenido">
				<?
					switch ( $oTab->getValue() )
				{
					case 2:
						$oLst = $this->oModule->loadClass('ubicacion_lst');
						echo $this->makeFlt();
						echo $oLst->makeSel();
					break;
					case 1:
					// La ubicacion actual es la que recibe del opener, la seleccion actual o la ultima seleccion.
						$aKeyValue = explode( "|", $_GET ['ncUbicacion'] );
						if ( $aKeyValue[0] )
						{
							$ncPais = $aKeyValue[0];
							$ncUbicacion = $aKeyValue[1] ;
						}
						if ( $oncUbicacionFiltro->getValue() )
						{
							$ncPais = $oncUbicacionFiltro->getValueIndex(0) ;
							$ncUbicacion = $oncUbicacionFiltro->getValueIndex(1) ;
						}
					// Arma la Referencia
						if ( $ncUbicacion && $ncPais )
						{
							$aReferencia = $this->armarReferencia( $ncPais, $ncUbicacion );
						}
					// Configura los Campos de Edicion
						$oncUbicacionActual->setValue( $ncPais . '|' . $ncUbicacion );
						$oncUbicacionActual->setHidden();
						$oncUbicacionFiltro->setMandatory(false);
						$cSql = "SELECT ncPais, cdUbicacion, ncUbicacion  FROM acUbicacion WHERE ";
						$cSql .= ( $ncUbicacion ) ? " ncPais = $ncPais AND ncUbicacionPadre = $ncUbicacion " : " ncUbicacionPadre is null ";
						$cSql .= ' ORDER BY cdUbicacion';
						$oncUbicacionFiltro->addColValue( 2 );
						$oncUbicacionFiltro->setMatrix( $this->oDatabase->getMatrix ( $cSql ) );
						$oncUbicacionFiltro->setOnChangeSubmit(true);
						//$oncUbicacionFiltro->setOnChangeAutoSubmit($this);
				?>
				<div class="formulario">
					<h3>Buscar una Ubicacion Geografica</h3>
						<form method="post" action="<?= $cUrl; ?>">
							<a href='<?=$cUrl;?>'>Lugar: </a><?= $aReferencia['cUrl']; ?>
							<?= $oncUbicacionActual->make(); ?>
							<?= $oncUbicacionFiltro->make(); ?>
						<br/>
							<p>
								Codigo Postal: <?= $aReferencia['cPostal']; ?>
							</p>
							<p>
								Prefijo Telefono: <?= $aReferencia['cPrefijoTelefono']; ?>
							</p>
							<p>
								<input type="submit" name="Aceptar" value="Aceptar" class="button" accesskey="A"/>
							</p>
						</form>
				</div>
			<?
					break;
				}
			?>
		</div>
		<?
		}
	}
?>